﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO.Base;
using System.Collections.Generic;
using AccesoDatos.DTO;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de TitulacionDAO
    /// </summary>
    public class TitulacionDAO : BaseDAO, IDAO
    {

        #region Singleton

        private static TitulacionDAO instance;

        private TitulacionDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de TitulacionDAO
        /// </summary>
        /// <returns>instancia de TitulacionDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static TitulacionDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new TitulacionDAO();
            }

            return instance;
        }

        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que rellena un bean a partir de un SqlDataReader
        /// </summary>
        /// <param name="dr">SqlDataReader del cual se obtendran los datos</param>
        /// <returns>Objeto TitulacionDTO relleno con los datos</returns>
        private TitulacionDTO RellenaBean(SqlDataReader dr) 
        {
            TitulacionDTO bean = new TitulacionDTO();
            bean.CoTitulacion = this.GetNullableIntFromDataReader(dr, "CO_TITULACION");
            bean.Nombre = this.GetStringFromDataReader(dr, "NOMBRE");
            bean.Creditos = this.GetNullableIntFromDataReader(dr, "CREDITOSTIT");
            return bean;
        }

        #endregion

        #region Miembros de IDAO

        /// <summary>
        /// Metodo que inserta un registro de titulacion en la base de datos
        /// </summary>
        /// <param name="dto">Objeto IDTO que contiene todos lo parametros para la insercion</param>
        public void Insert(IDTO dto)
        {
            TitulacionDTO filtro = new TitulacionDTO();
            filtro = (TitulacionDTO)dto;
            try
            {
                string sql = "spu_TitulacionDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.Parameters.AddWithValue("@CoTitulacion", filtro.CoTitulacion);
                cmd.Parameters.AddWithValue("@Nombre", filtro.Nombre);
                cmd.Parameters.AddWithValue("@CreditosTit", filtro.Creditos);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex) 
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un registro de titulacion de la base de datos
        /// </summary>
        /// <param name="dto">Objeto IDTO que contiene los parametros para eliminar</param>
        public void Delete(IDTO dto)
        {
            TitulacionDTO filtro = new TitulacionDTO();
            filtro = (TitulacionDTO)dto;
            try
            {
                string sql = "spu_TitulacionDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoTitulacion", filtro.CoTitulacion);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="filtro"></param>
        public void Update(IDTO dto)
        {
            TitulacionDTO filtro = new TitulacionDTO();
            filtro = (TitulacionDTO)dto;
            try
            {
                string sql = "spu_TitulacionDAO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoTitulacion", filtro.CoTitulacion);
                cmd.Parameters.AddWithValue("@Nombre", filtro.Nombre);
                cmd.Parameters.AddWithValue("@CreditosTit", filtro.Creditos);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Funcion que devuelve un listado de las titulaciones
        /// </summary>
        /// <param name="dto">No empleamos este objeto ya que queremos un listado completo</param>
        /// <returns></returns>
        public List<IDTO> Get(IDTO dto)
        {
            TitulacionDTO filtro = new TitulacionDTO();
            filtro = (TitulacionDTO)dto;
            try
            {
                List<IDTO> lista = new List<IDTO>();
                string sql = "spu_TitulacionDAO_GetTitulaciones";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoTitulacion", filtro.CoTitulacion);
                cmd.Parameters.AddWithValue("@Nombre", filtro.Nombre);
                cmd.Parameters.AddWithValue("@CreditosTit", filtro.Creditos);
                using (SqlDataReader dr = cmd.ExecuteReader()) 
                {
                    while (dr.Read()) 
                    {
                        TitulacionDTO bean = new TitulacionDTO();
                        bean = RellenaBean(dr);
                        lista.Add(bean);
                    }
                }
                return lista;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        #endregion
    }
}